#pragma once
#include <unistd.h>
#include "DataManager.hpp"

extern lcl_backup::DataManager *_data;

namespace lcl_backup
{
    class HotManager
    {
    private:
        // 非热点文件-返回真；热点文件-返回假
        bool HotJudge(const std::string &filename)
        {
            FileUtil fu(filename);
            time_t last_atime = fu.LastATime(); // 获取最后一次访问时间
            time_t cur_time = time(NULL);
            if (cur_time - last_atime > _hot_time)
            {
                return true;
            }
            return false;
        }
    public:
        HotManager()
        {
            Config *config = Config::GetInstance();
            _back_dir = config->GetBackDir();
            _pack_dir = config->GetPackDir();
            _pack_suffix = config->GetPackFileSuffix();
            _hot_time = config->GetHotTime();
            // 如果目录不存在，则创建目录 
            FileUtil tmp1(_back_dir);
            FileUtil tmp2(_pack_dir);
            tmp1.CreateDirectory();
            tmp2.CreateDirectory();
        }
        bool RunModule()
        {
            while (1)
            {
                // 1. 遍历备份目录，获取所有文件名
                FileUtil fu(_back_dir);
                std::vector<std::string> arry;
                fu.ScanDirectory(&arry);
                // 2. 遍历判断文件是否是非热点文件
                for (auto &a : arry)
                {
                    if (HotJudge(a) == false)
                        continue; // 热点文件则不需要特别处理
                    // 走到这里就是非热点文件
                    // 3. 获取文件的备份信息
                    BackupInfo file_info;
                    if (_data->GetOneByRealPath(a, &file_info) == false)
                    {
                        // 现在有一个文件存在，但是没有备份信息
                        file_info.NewBackupInfo(a); // 设置一个新的备份信息出来
                    }
                    // 4. 对非热点文件进行压缩处理
                    FileUtil tmp(a);
                    tmp.Compress(file_info.pack_path);
                    // 5. 删除源文件，修改备份信息
                    tmp.Remove();
                    file_info.pack_flag = true;
                    _data->Update(file_info);
                }
                usleep(1000); // 避免空目录循环遍历，消耗cpu资源过高
            }
            return true;
        }
    private:
        std::string _back_dir;    // 备份文件路径
        std::string _pack_dir;    // 压缩文件路径
        std::string _pack_suffix; // 压缩包后缀
        int _hot_time;            // 热点时间
    };
}